package sll;

import sllvm.IntAndTable;
import sllvm.Table;

public class PrintStm extends Stm 
{
	public ExpList exps;
	public PrintStm(ExpList e) 
	{
		exps=e;
	}
	@Override
	public Table interpretate(Table t)   
	{
		IntAndTable it;		
		ExpList list = exps;
		
		// mantemos lista do que deve ser impresso para evitar confusoes com neasted prints
		int[] printList = new int[exps.count()];
		int lastPrint = 0;
		
		while (list != null)
		{
			if (list instanceof LastExpList)
			{
				LastExpList le = (LastExpList)list;
				it = le.head.interpretate(t);				
				list = null;
			}
			else
			{
				PairExpList pe = (PairExpList)list;
				it = pe.head.interpretate(t);
				list = pe.tail;
			}
			
			// atualizamos tabela com resultado da execução
			t = it.table;
			// guardamos o que precisamos imprimir
			printList[lastPrint++] = it.integer;			
		}
		
		// geramos string para impressao
		String printStr = new String();
		for(int i : printList)
			printStr += i + " ";
		
		// imprimimos e pulamos linha
		System.out.println(printStr);
		
		return t;
	}
}